package com.wlb365.financing.modules.trade.service;

import com.wlb365.financing.modules.trade.response.QueryBankListRes;
import com.wlb365.financing.modules.trade.response.VoucherDetailRes;
import com.wlb365.financing.modules.trade.response.VoucherGenerateRes;
import com.wlb365.financing.modules.trade.response.VoucherPreviewRes;
import com.wlb365.financing.modules.trade.response.VoucherQueryRes;
import com.wlb365.financing.modules.trade.response.voucher.CancelVoucherRes;
import com.wlb365.financing.modules.trade.response.voucher.VoucherAuditRes;
import com.wlb365.financing.modules.trade.response.voucher.VoucherUpdateRes;
import com.wlb365.financing.modules.trade.vo.TemplateVO;
import com.wlb365.financing.modules.trade.vo.VoucherQueryVO;
import com.wlb365.sdk.model.CommonResponse;

import java.util.List;

/**
 * 凭证服务类.
 *
 * @author zwh
 * @version 1.0
 */
public interface IVoucherService {

    /**
    * 分页查询凭证列表.
    * @param queryVO 查询条件
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.VoucherQueryRes
    **/
    VoucherQueryRes page (VoucherQueryVO queryVO);

    /**
    * 查询凭证详情.
    * @param id 凭证id
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.VoucherDetailRes
    **/
    VoucherDetailRes detail (String id);

    /**
    * 凭证预览.
     *
     * <p>用于凭证生成前的预览</p>
    * @param tradeId 交易id
    * @param templateId 数据模板id
     * @param ids 数据id
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.VoucherPreviewRes
    **/
    VoucherPreviewRes voucherPreview (String tradeId, String templateId, String ids);

    /**
     * 查询模板列表.
     *
     * <p>用于查询交易数据关联的模板列表</p>
     * @param compId 核心企业ID
     * @author zwh
     * @return com.wlb365.financing.modules.trade.response.QueryBankListRes
     **/
    List<TemplateVO> queryTemplateList(String compId);

    /**
    * 查询银行列表.
     *
     * <p>用于凭证生成或发送时选择银行</p>
    * @param compId 机构id
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.QueryBankListRes
    **/
    QueryBankListRes queryBankList(String compId);

    /**
    * 生成凭证.
    * @param tradeId 交易id 【必填】
    * @param templateId 数据模板id 【必填】
    * @param bankId 银行id 【可空】
    * @param ids 数据id 【必填】
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.VoucherGenerateRes
    **/
    VoucherGenerateRes generate (String tradeId, String templateId, String bankId, String ids);

    /**
    * 审批凭证
    * @param id 凭证id 【必填】
    * @param status 审批状态（1-通过；2-拒绝） 【必填】
    * @param remark 审批意见 【可空】
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.voucher.VoucherAuditRes
    **/
    VoucherAuditRes audit (String id, String status, String remark);

    /**
    * 更新凭证签章状态.
    * @param id 凭证id
    * @param flowId 签章流程id
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.voucher.VoucherAuditRes
    **/
    VoucherUpdateRes updateSign (String id, String flowId);
//
//    /**
//    * 更新凭证状态.
//    * @param id 凭证id 【必填】
//    * @param status 凭证状态 【可空】，如果不传，默认更新到凭证下一个流转状态。
//    * @author zwh
//    * @return com.wlb365.financing.modules.trade.response.voucher.UpdateVoucherStatusRes
//    **/
//    UpdateVoucherStatusRes updateVoucherStatus(String id, String status, String sign);

    /**
    * 取消凭证（作废）.
    * @param id 凭证id 【必填】
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.voucher.CancelVoucherRes
    **/
    CancelVoucherRes cancelVoucher(String id);

    /**
    * 凭证更新.
     *
     * <p>目前只用于了更新凭证中的银行id，后期如果需要更新其他的，在修改此接口</p>
    * @param id  凭证id 【必填】
    * @param bankId 银行id 【可空】
     * @param sign 签章状态
     * @param nextStatus 是否更新到下一个状态，默认false 【可空】
    * @author zwh
    * @return com.wlb365.financing.modules.trade.response.voucher.VoucherUpdateRes
    **/
    VoucherUpdateRes update(String id, String bankId, String sign, boolean nextStatus);

    /**
     * 凭证发送.
     *
     * @param id  凭证id 【必填】
     * @param bankId 银行id 【必填】
     * @author zwh
     * @return com.wlb365.financing.modules.trade.response.voucher.VoucherUpdateRes
     **/
    CommonResponse send(String id, String bankId);

}
